GROUP BY와 HAVING

✒️ 2025-05-28 17:38 내용 수정


GROUP BY

SELECT 찾을내용
FROM 테이블명
WHERE 조건문
GROUP BY 특정그룹
ORDER BY 정렬기준;
-- EMPLOYEES 테이블에서 각 부서별 급여의 평균과 총 합을 출력
SELECT DEPARTMENT_ID, AVG(SALARY), SUM(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;

GROUP BY 1.png

-- EMPLOYEES 테이블에서 부서별, 직종별로 그룹을 나눠서 인원수를 출력하되,
-- 부서 번호가 낮은 순으로 정렬
SELECT DEPARTMENT_ID, JOB_ID, COUNT(*)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID, JOB_ID
ORDER BY DEPARTMENT_ID;

GROUP BY 2.png


GROUP BY 절 확장 구문

HAVING

SELECT 찾을내용
FROM 테이블명
WHERE 조건문
GROUP BY 특정그룹
HAVING 조건문
ORDER BY 정렬기준;
-- EMPLOYEES 테이블에서 각 부서의 급여의 최대값, 최소값, 인원수를 출력하되,
-- 급여의 최대값이 8000 이상인 결과만 조회
SELECT DEPARTMENT_ID, MAX(SALARY), MIN(SALARY), COUNT(*)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING MAX(SALARY) >= 8000;

HAVING 1.png

-- EMPLOYEES 테이블에서 각 부서별 평균 급여를 소수점 첫번째 자리 까지 출력(반올림)하되,
-- 평균 급여가 10000 미만이고, 부서 번호가 50번인 부서만 조회
SELECT DEPARTMENT_ID, ROUND(AVG(SALARY), 1)
FROM EMPLOYEES
WHERE DEPARTMENT_ID <= 50 -- 부서 번호 조건으로 먼저 그룹 데이터를 추린다.
GROUP BY DEPARTMENT_ID
HAVING ROUND(AVG(SALARY), 1) < 10000;

HAVING 2.png


MySQL에서 사용 시 WITH ROLLUP, GROUPING()

  1. WITH ROLLUP : GRUOP BY 절과 함께 사용하며, 전체 그룹 합계(WITH ROLLUP, super-aggregate)와 작은 그룹별 합계(GROUP BY, aggregate, 서브그룹)를 모두 확인할 때 사용한다.
SELECT 컬럼명
FROM 테이블명
WHERE 조건절
GROUP BY 컬럼명 WITH ROLLUP;
  1. GROUPING() : GROUP BY에서 사용된 ROLLUP과 함께 사용하여, WITH ROLLUP으로 산출된 통계 결과인 NULL 필드값과 실제 데이터에 있는 NULL 값을 구별하지 못할 때 이를 구분하기 위해 사용한다.
    • NULL로 표시된 해당 열이 subtotal을 표시한다면 1을, 그 외의 값이라면 0을 반환한다.
    • 참고 자료 : MySQL Group by
    • SELECT, HAVING 절, ORDER BY 절에서 사용할 수 있다.
    • GROUPING() 대상은 반드시 GROUP BY 대상 컬럼과 동일한 컬럼이어야 한다.
SELECT 컬럼명1, GROUPING(컬럼명1), 컬럼명2
FROM 테이블명
WHERE 조건절
GROUP BY 컬럼명1 WITH ROLLUP;

Oracle에서 사용시 ROLLUP, CUBE, GROUPING()

참고 자료 : Oracle ROLLUP, Oracle ROLLUP extension

  1. ROLLUP : MySQL의 WITH ROLLUP과 마찬가지로 전체 그룹의 합계와 작은 그룹별 합계를 확인할 때 사용한다.
    • 조합 가능한 작은 그룹에 대해서만 그룹별 합계를 만든다.
SELECT 컬럼명1, 컬럼명2
FROM 테이블명
WHERE 조건절
GROUP BY ROLLUP(컬럼명1, 컬럼명2);
  1. CUBE : ROLLUP과 다르게 조합 가능한 모든 작은 그룹에 대한 그룹별 합계와 전체 그룹의 합계를 만들 때 사용한다.
    • ROLLUP에서 그룹 조합을 바꿔서 확인하려면 ROLLUP(컬럼명1, 컬럼명2)를 ROLLUP(컬럼명2, 컬럼명1) 방식으로 바꿔 작성해서 확인해야 하지만, CUBE를 사용하면 한 번에 모든 조합을 확인할 수 있다.
SELECT 컬럼명1, 컬럼명2
FROM 테이블명
WHERE 조건절
GROUP BY CUBE(컬럼명1, 컬럼명2);
  1. GROUPING() : GROUP BY에서 사용된 ROLLUP과 함께 사용하여, WITH ROLLUP으로 산출된 통계 결과인 NULL 필드값과 실제 데이터에 있는 NULL 값을 구별하지 못할 때 이를 구분하기 위해 사용한다.
SELECT 컬럼명1, GROUPING(컬럼명1), 컬럼명2
FROM 테이블명
WHERE 조건절
GROUP BY ROLLUP(컬럼명1);